package com.elvish.efast.modules.sys.service;

import com.elvish.efast.common.entity.TreeData;
import com.elvish.efast.modules.sys.dao.PermissionDao;
import com.elvish.efast.modules.sys.entity.Permission;
import com.google.common.collect.Lists;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * (TPermission)表服务实现类
 *
 * @author makejava
 * @since 2018-11-19 14:22:46
 */
@Component
public class PermissionService {
    @Autowired
    private PermissionDao tPermissionDao;

    /**
     * 查询多条数据
     *
     * @return 对象列表
     */
    public List<Permission> queryAll(Permission permission) {
        return this.tPermissionDao.queryAll(permission);
    }

    /**
     * 查询多条数据
     *
     * @return 对象列表
     */
    public List<Permission> getAuthTree(String roleId) {
        List<Permission> dataList = this.tPermissionDao.queryAll(null);
        if (Lang.isEmpty(dataList)) {
            return null;
        }
        if (Strings.isNotBlank(roleId)) {
            // 根据roleId查询权限
            List<Permission> perms = this.tPermissionDao.queryByRoleId(roleId);

            if (!Lang.isEmpty(perms)) {
                // checkBox 选中
                for (Permission rolePerm : perms) {
                    for (Permission rootPerm : dataList) {
                        if (rootPerm.getId().equals(rolePerm.getId())) {
                            rootPerm.setChecked(true);
                            break;
                        }
                    }
                }
            }

        }
        List<Permission> root = Lists.newArrayList();
        for (Permission child : dataList) {
            String pid = child.getPid();
            // 一级
            if (Strings.isBlank(pid) || "-1".equals(pid)) {
                root.add(child);
            } else {
                // 一级以下
                for (Permission parent : dataList) {
                    String id = parent.getId();
                    if (pid.equals(id)) {
                        if (parent.getChildren() == null) {
                            List<Permission> children = Lists.newArrayList();
                            parent.setChildren(children);
                        }
                        parent.getChildren().add(child);
                    }
                }
            }
        }


        return root;
    }


    /**
     * 获取树形结构数据
     *
     * @return 树形结构数据
     */
    public List<TreeData> getTreeData() {
        return this.tPermissionDao.getTreeData();
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public Permission queryById(String id) {
        return this.tPermissionDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    public List<Permission> queryAllByLimit(int offset, int limit) {
        return this.tPermissionDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param tPermission 实例对象
     * @return 实例对象
     */
    public Permission insert(Permission tPermission) {
        this.tPermissionDao.insert(tPermission);
        return tPermission;
    }

    /**
     * 修改数据
     *
     * @param tPermission 实例对象
     * @return 实例对象
     */
    public Permission update(Permission tPermission) {
        this.tPermissionDao.update(tPermission);
        return this.queryById(tPermission.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param permission 主键
     * @return 是否成功
     */
    public boolean deleteById(Permission permission) {
        List<Permission> permissions = getByPid(permission.getId());
        if (permissions == null) {
            permissions = Lists.newArrayList();
        }
        permissions.add(permission);
        return this.tPermissionDao.deleteByIds(permissions) > 0;
    }

    /**
     * 父找子
     *
     * @param pid 父主键
     * @return 对象列表
     */
    public List<Permission> getByPid(String pid) {
        return this.tPermissionDao.getByPid(pid);
    }
}